home *** CD-ROM | disk | FTP | other *** search
- (* Modulentwicklung für Twilight unter Pure Pascal *)
- (* Entwicklung von Carsten Meyer @HH2 *)
-
- { Dieses ist das eigentliche Modul,was im Endeffekt als UNIT compiliert }
- { wird. - siehe Readme }
-
-
- unit tlm_mod;
-
- interface { öffentlicher Teil }
-
-
- uses tl_inter;
-
- type
- ParBlk=Record { der Parameterblock TYPE für's VDI }
- p_cntrl:^integer;
- p_intin:^integer;
- p_ptsin:^integer;
- p_intout:^integer;
- p_ptsout:^integer;
- end;
-
- {#############################################################################}
-
- { Die Arrays fürs VDI und das Handle }
-
- {#############################################################################}
-
- var
- contrl:array [0.. 11] of integer;
- intin :array [0..127] of integer;
- intout:array [0..127] of integer;
- ptsin :array [0..127] of integer;
- ptsout:array [0..127] of integer;
- vdi_hnd:integer;
-
- {#############################################################################}
-
- { der Parameterblock HIMSELF für's VDI }
-
- {#############################################################################}
-
-
- const VidParBlk:ParBlk
- =
- ( p_cntrl:@contrl;
- p_intin:@intin;
- p_ptsin:@ptsin;
- p_intout:@intout;
- p_ptsout:@ptsout;
- );
-
- {#############################################################################}
-
- procedure TLM_START(tl_info:INFO_PTR);
-
- implementation { Nicht öffentlicher Teil }
-
- {$S-} { Keine Überprüfung auf Stacküberlauf zur Laufzeit }
- {$L-} { Lokale Symbole werden nicht abgelegt }
- {$V-} { Strings als Var-Parameter dürfen unterschiedliche Länge haben }
- {$D-} { Keine Debuginformation }
- {$I-} { Benutzerprogramm prüft auf Fehler bei Ein-/Ausgabe }
-
-
- Type
-
- GRECT= { Typ eines GRECT's }
- record
- x,y,w,h:integer;
- end;
-
- GRECT_PTR=^GRECT; { ein pointer darauf }
- MFDBPtr = ^MFDB;
- MFDB = record
- fd_addr : Pointer; { Zeiger auf Speicherblock }
- fd_w : Integer; { Rasterbreite in Pixeln }
- fd_h : Integer; { Rasterhöhe in Pixeln }
- fd_wdwidth : Integer; { Rasterbreite in Worten }
- fd_stand : Integer; { 0 geräteabhängiges Format }
- { 1 Standardformat }
- fd_nplanes : Integer; { Anzahl der Bildebenen }
- fd_r1 : Integer; { reserviert }
- fd_r2 : Integer; { reserviert }
- fd_r3 : Integer; { reserviert }
- end;
-
- {#############################################################################}
-
- { ein paar VDI Funktionen }
-
- {#############################################################################}
-
-
- procedure rect(x1,y1,x2,y2:integer);
- begin
- ptsin[0]:=x1;
- ptsin[1]:=y1;
- ptsin[2]:=x2;
- ptsin[3]:=y2;
- contrl[0]:=11; { GDP }
- contrl[1]:=2; { 2 punkte }
- contrl[2]:=0; { 0 ptsout }
- contrl[3]:=0; { no intin's}
- contrl[4]:=0;
- contrl[5]:=1; { v_bar }
- contrl[6]:=vdi_hnd;
- VDI();
- end;
-
- procedure line(x1,y1,x2,y2:integer);
- begin
- ptsin[0]:=x1;
- ptsin[1]:=y1;
- ptsin[2]:=x2;
- ptsin[3]:=y2;
- contrl[0]:=6; { v_pline }
- contrl[1]:=2; { 2 punkte }
- contrl[2]:=0; { 0 ptsout }
- contrl[3]:=0; { no intin's}
- contrl[4]:=0;
- contrl[6]:=vdi_hnd;
- VDI();
- end;
-
- procedure set_para(para,vdi_func:integer);
- begin
- intin[0]:=para;
- contrl[0]:=vdi_func; { vsl_color }
- contrl[1]:=0; { 0 punkte }
- contrl[2]:=0; { 0 punkte }
- contrl[3]:=1; { 1 intin's }
- if vdi_func=17 then
- contrl[4]:=1 { color 1 zurück }
- else
- contrl[4]:=0; { sonst keinen }
- contrl[6]:=vdi_hnd;
- VDI();
- end;
-
- procedure wrmode(m:integer);begin set_para(m,32);end;
- procedure ltype(l:integer);begin set_para(l,15);end;
- procedure lcolor(c:integer);begin set_para(c,17);end;
- procedure tcolor(c:integer);begin set_para(c,22);end;
- procedure finter(c:integer);begin set_para(c,23);end;
- procedure fstyle(c:integer);begin set_para(c,24);end;
- procedure fcolor(c:integer);begin set_para(c,25);end;
-
- procedure lwidth( l:integer);
- begin
- ptsin[0]:=l;
- ptsin[1]:=0;
- contrl[0]:=16; { vsl_color }
- contrl[1]:=1; { 1 punkte }
- contrl[2]:=1;
- contrl[3]:=0; { 1 intin's }
- contrl[4]:=0; { 1 intin's }
- contrl[6]:=vdi_hnd;
- VDI();
- end;
-
- procedure lends( beg, ende:integer);
- begin
- intin[0]:=beg;
- intin[1]:=ende;
- contrl[0]:=108; { vsl_color }
- contrl[1]:=0; { 1 punkte }
- contrl[2]:=0;
- contrl[3]:=2; { intin's }
- contrl[4]:=0; { 1 intin's }
- contrl[6]:=vdi_hnd;
- VDI();
- end;
-
- procedure male_ein_bitblk(x,y:integer; data:pointer;w,h,c:integer);
- var scr_mfdb,bit_mfdb:MFDB;
- begin
- bit_mfdb.fd_addr:=data; { Zeiger auf Speicherblock }
- bit_mfdb.fd_w :=w; { Rasterbreite in Pixeln }
- bit_mfdb.fd_h :=h; { Rasterhöhe in Pixeln }
- bit_mfdb.fd_wdwidth :=(w+15)shr 4; { Rasterbreite in Worten }
- bit_mfdb.fd_stand :=0; { 0 geräteabhängiges Format }
- bit_mfdb.fd_nplanes :=1; { Anzahl der Bildebenen }
-
- scr_mfdb.fd_addr:=NIL;
-
- intin[0]:=2; { transparant }
- intin[1]:=c; { vordergrundfarbe }
- intin[2]:=0; { dummy hintergrund }
-
-
- ptsin[0]:=0; { Quell Rechtech im bitblk }
- ptsin[1]:=0;
- ptsin[2]:=w;
- ptsin[3]:=h;
- ptsin[4]:=x; { Ziel Rechteck im Screen }
- ptsin[5]:=y;
- ptsin[6]:=x+w-1;
- ptsin[7]:=y+h-1;
-
- contrl[ 0]:=121; { VRT_CPYFM ProfiBuch S.418 }
- contrl[ 1]:=4; { 4 points in }
- contrl[ 2]:=0; { 0 points zurück }
- contrl[ 3]:=3; { 3 ints in }
- contrl[ 4]:=0; { 0 ints zurück }
- contrl[ 6]:=vdi_hnd;
- contrl[ 7]:=integer(longint(@bit_mfdb) shr 16); { high word der adresse des bit_mfdb }
- contrl[ 8]:=integer(longint(@bit_mfdb) ); { low word der adresse des bit_mfdb }
- contrl[ 9]:=integer(longint(@scr_mfdb) shr 16); { high word der adresse des scr_mfdb }
- contrl[10]:=integer(longint(@scr_mfdb) ); { low word der adresse des scr_mfdb }
-
- VDI();
- end;
-
- {#############################################################################}
-
- { bei Übergabe von NIL clipping AUS, sonst auf das Rechteck, auf das der pointer zeigt AN }
-
- {#############################################################################}
-
- procedure set_clip(rect: GRECT_PTR);
- begin
- if(rect<>NIL) then
- with rect^ do
- begin
- ptsin[0]:=x;
- ptsin[1]:=y;
- ptsin[2]:=x+w-1;
- ptsin[3]:=y+h-1;
- intin[0]:=1;
- end
- else
- intin[0]:=0;
- contrl[0]:=129; { vs_clip }
- contrl[1]:=2; { 0 punkte }
- contrl[2]:=0; { 0 punkte zurück }
- contrl[3]:=1; { 1 intin's }
- contrl[4]:=0; { 0 ints zurück }
- contrl[6]:=vdi_hnd;
- VDI();
- end;
-
-
- procedure gtext(x,y:integer; s:string);
- var i,l:integer;
- begin
- ptsin[0]:=x;
- ptsin[1]:=y;
- l:=integer(s[0]);
- for i:=0 to l-1 do
- intin[i]:=integer(s[i+1]);
- contrl[0]:=8;
- contrl[1]:=1;
- contrl[3]:=l;
- contrl[6]:=vdi_hnd;
- VDI();
- end;
-
- procedure itoa(i:integer; var s:string);
- var d:integer;
- l:integer;
- begin
- s[0]:=char(5);
- s[1]:=char(((i div 10000)mod 10)+ord('0'));
- s[2]:=char(((i div 1000)mod 10)+ord('0'));
- s[3]:=char(((i div 100)mod 10)+ord('0'));
- s[4]:=char(((i div 10)mod 10)+ord('0'));
- s[5]:=char(((i )mod 10)+ord('0'));
- end;
-
-
- {#############################################################################}
- { }
- { Hier gehts los.... }
- { }
- {#############################################################################}
-
-
- procedure TLM_START(tl_info:INFO_PTR);
- var clip:GRECT;
- c,x,y,w,h,dirx,diry:integer;
- bit:BITBLKPTR;
- ttt:string;
- begin
- bit:=@rs_bitblk[0];
-
- w:=bit^.bi_wb*8;
- h:=bit^.bi_hl;
- c:=bit^.bi_color;
-
- vdi_hnd:=tl_info^.tl_handle;
- itoa(vdi_hnd,ttt);
- clip.x:=0;
- clip.y:=0;
- clip.w:=tl_info^.max_x+1;
- clip.h:=tl_info^.max_y+1;
- wrmode(1);
- ltype(1);
- lwidth(3);
- lends(1,1);
- fcolor(0);
- fstyle(1);
- finter(0);
- x:=0;
- y:=0;
- dirx:=13;
- diry:=16; { durch 8 teilbares Iconformat }
- set_clip(@clip);
- repeat
- tcolor(c);
- if c=tl_info^.max_colors then c:=0 else c:=c+1;
- if(dirx>0)and(x+dirx+w>tl_info^.max_x) then dirx:=-dirx;
- if(dirx<0)and(x+dirx<0) then dirx:=-dirx;
- if(diry>0)and(y+diry+h>tl_info^.max_y) then diry:=-diry;
- if(diry<0)and(y+diry<0) then diry:=-diry;
- x:=x+dirx;
- y:=y+diry;
-
- gtext(x,y,ttt);
-
- until (tl_info^.tl_check()<>0);
- end;
-
- end.
-